(本篇文章網誌版:http://shineright.blogspot.tw/2016/12/day-14-animator.html)
Day 9曾提到,有些裝備(死亡之帽、綠帽、皮卡耳、雷達)會有發射時特別的樣子。
要更變射擊時的樣子(也就是改變sprite)有許多方式,因為懶得多寫程式碼,所以我將使用Unity方便的Animator系統。
點擊製作發射狀態的Game Object,進入Animation視窗,按Create。這個步驟先前已經做過許多次,但先前沒說過在建立Animation那一刻,Unity會自動為該sprite建立一個用來控制Animation的Animator。
點選上方Window選單,把Animator視窗打開,可以看到Unity已經建立好一個動畫流程圖了。
在Animator任一處按右鍵,選Create State→Empty建立一個動畫狀態,命名為「Shoot State」,並把一開始自動產生的動畫狀態命名為「Normal State」。接著,在Normal State上點擊右鍵→Make Transition,把鍵頭拉向Shoot State。也在Shoot State上點擊右鍵→Make Transition,把箭頭拉向Normal State。
進行下一步之前,先來簡單講解一下Animator的運作方式。Animator可以建立Transition(也就是剛剛建立的箭頭),控制一個動畫狀態(片段)是否可以轉往另一個狀態。例如,Normal State有箭頭指向Shoot State,所以Normal State可以轉換到Shoot State。同理,Shoot State有箭頭指向Normal State,所以Shoot State也可以轉換到Normal State。
但究竟要如何轉換呢?常用的轉換方式大致分為兩種:一、在動畫片段結束後(或過一段時間後)自動轉換。二、建立Animator的參數,並以Script控制轉換的時機。
上述兩種轉換方式我都會用到。從Normal State到Shoot State,我會從SpawnBullet.cs中控制,從Shoot State到Normal State,我會讓動畫結束後自動轉換。
先來製作比較簡單的自動轉換……事實上,完全不用做任何事情。點擊Shoot State到Normal State的箭頭,在Inspector中,可以看到Has Exit Time被勾選了。這就代表這個Transition會在時間結束後自動進行。
接著來看如何用Script控制Animator。點擊Animator左上方的Parameters鈕,並點Parameters欄右上方的+號,選擇Trigger,命名為「Shoot」。
接著點擊Normal State到Shoot State的箭頭,在Inspector中把「Has Exit Time」取消,並在下方的Conditions欄中按+,因為這個Animator只有一個Parameter,所以Unity會自動選擇剛剛建立的Shoot。這表示,當Animator在Normal State時,在Script中觸發「Shoot」,Animator就會轉換到「Shoot State」。
打開先前寫好的「SpawnBullet.cs」,新宣告一個變數:
public Animator shootAnim = null;
並在SpawnCoroutine()
的while (true)
中,
GameObject bullet = (Instantiate (bulletPrefab, new Vector3 (transform.position.x, transform.position.y, 0.1f), Quaternion.identity) as GameObject);
的下方加入
if (shootAnim != null)
shootAnim.SetTrigger ("Shoot");
就完成了。
Animator型態的shootAnim是用來儲存擁有Animator Component的Game Object (Unity會自動為有Animation的Game Object建立Animator Component)。
在Instantiate
子彈下方,因為有些裝備不需改變射擊狀態,所以必須先判斷shootAnim
是否為null
,如果不是,就呼叫SetTrigger()
並傳入”Shoot”
,以觸發剛剛在Animator建立的「Shoot」 Parameter。
寫完短短幾行程式碼,回到Animation視窗,在左上角Create New Clip新建動畫片段。
把兩個動畫片段的時間軸都拉上sprite (Shoot片段記得把sprite拉到想要的持續時間)。
並在兩個動畫片段的Inspector欄中把「Loop Time」取消,畢竟這個動畫片段不需重複播放。
回到Animator視窗,Unity自動新增了一個剛剛建立的動畫狀態。把它刪了,並點擊Shoot State,把Motion欄設為剛剛建立的動畫。
最後,在裝備的Inspector欄把Animator設定好就大功告成了。
進入Play Mode測試,裝備現在會隨著子彈的發射而改變sprite了。
完成開始畫面……其實只是把人物疊一疊,加一些字就好了。
待續。